<?php

namespace Juheip\IpService\platforms\tianxing;

use Juheip\IpService\contract\AbstractPlatform;
use Juheip\IpService\exception\InvalidArgementException;

class TianXingPlatform extends AbstractPlatform
{
    private $config = [];

    public function init(array $config): self
    {
        $this->config = $config;

        return $this;
    }

    /**
     * 获取本商户基本信息
     */
    public function getmyinfo()
    {
        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getmyinfo', ['token' => $this->config ['token']]);
    }

    /**
     * 获取游戏项目
     */
    public function getproject()
    {
        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getproject', ['token' => $this->config ['token']]);
    }

    /**
     * 获取服务器节点
     */
    public function getnode()
    {
        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getnode', ['token' => $this->config ['token']]);
    }

    /**
     * 获取服务器状态
     * @param string 数组转JSON字符串，其中数字为【下单购买】时的sid值，数组长度不能大于100，超过100会丢弃 
     */
    public function getServerStatus($sids)
    {
        $params = [
            'sids' => $sids,
            'token' => $this->config ['token']
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getServerStatus', $params);
    }

    /**
     * 下单购买
     * @param int $time 只能是2000,6000,12000,100,700,1,3,6,12。分别代表2小时,6小时,12小时,1天,7天,1个月，3个月，6个月，12个月.其中2000,6000,12000,为特殊权限需要联系客服开通
     * @param string $list json数组转化后的字符串 nid为节点ID从【获取可购买节点或获取服务器节点】获得，number为当前节点购买的数量,不可为0 [{"nid":625,"number":1}]
     * @param int $pid 项目id,从【获取游戏项目】获得
     * @param int $isrand 1为自定义用户 默认为3，为1时【自定义代理用户名】不可为空
     * @param string $p_user 自定义代理用户名
     * @param string $p_pass 自定义代理密码
     * @param int $port 需要使用自定义的端口号，不自定义为0即可
     * @param int $ipsegment IP段过滤，1：A段不重复,2：B段不重复，3：C段不重复，4：A,B段不重复，5：A,B,C段不重复
     * @param string $filter_sids 过滤服务器IP,值需要和【获取可购买/调换的节点】一致，下单时返回的sid值，多个用英文逗号分隔。可不传此值
     */
    public function placeorder($time, $list, $pid, $isrand = 3, $p_user = '', $p_pass = '', $port = 0, $ipsegment = 0, $filter_sids = '')
    {
        $params = [
            'token' => $this->config ['token'],
            'time' => $time,
            'list' => $list,
            'pid' => $pid,
            'isrand' => $isrand,
            'p_user' => $p_user,
            'p_pass' => $p_pass,
            'port' => $port,
            'ipsegment' => $ipsegment,
            'filter_sids' => $filter_sids
        ];
        
        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/placeorder', $params);
    }

    /**
     * 获取省份
     */
    public function getarea()
    {
        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getarea', ['token' => $this->config ['token']]);
    }

    /**
     * 代理续费
     * @param int $time 只能是100,700,1,3,6,12。分别代表1天,7天,1个月，3个月，6个月，12个月.1天和7天必须有权限才可以，其它默认有权限
     * @param string $ids 数组转json字符串,其中的数字为下单购买返回的子订单id【proxyid】
     */
    public function renew($time, $ids)
    {
        $params = [
            'time' => $time,
            'ids' => $ids,
            'token' => $this->config ['token']
        ];

        return $this->client->formRequest('post', $this->config ['server_url']. 'index/renew', $params);
    }

    /**
     * 获取支持的端口
     */
    public function getPort()
    {
        return $this->client->formRequest('post', $this->config ['server_url']. 'index/getPort', ['token' => $this->config ['token']]);
    }

    /**
     * 退订数据初始化
     * @param array $ids 数据为【下单购买】返回的proxyid
     */
    public function initUnsubscribe($ids)
    {
        return $this->client->formRequest('post', $this->config ['server_url']. 'index/initUnsubscribe', ['token' => $this->config ['token'], 'ids' => $ids]);
    }

    /**
     * 退订新开（使用这个请先使用退订初始化）
     * @param array $ids 初始化锁定的数组，不能加不能减，否则无法退订
     */
    public function unsubscribe($ids)
    {
        return $this->client->formRequest('post', $this->config ['server_url']. 'index/unsubscribe', ['token' => $this->config ['token'], 'ids' => $ids]);
    }

    /**
     * 获取订单下的数据
     * @param string $ordernos json字符串，如：["2024082707200000001","2024082707200000002"]
     * @param string $iids json字符串优先判断，存在数据则不在判断ordernos。如 [1,2,3,4,5]
     */
    public function getorderlist($ordernos, $iids)
    {
        $params = [
            'ordernos' => $ordernos,
            'iids' => $iids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getorderlist', $params);
    }

    /**
     * 项目更换
     * @param string $ids 数组转json字符串，数据为【下单购买】返回的proxyid
     * @param int $pid 项目id，就是【获取游戏项目】返回的id
     * @return {"code":0}
     */
    public function editProject($ids, $pid)
    {
        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/editProject', ['token' => $this->config ['token'], 'ids' => $ids, 'pid' => $pid]);
    }

    /**
     * 删除过期或者无用的代理【只做删除不会退积分】
     */
    public function del()
    {
        return $this->client->formRequest('post', $this->config ['server_url']. 'index/del', ['token' => $this->config ['token']]);
    }

    /** 特价类接口 */
    /**
     * 下单购买(特价版)
     * @param int $time 只能是2000,6000,12000,100,700,1,3,6,12。分别代表2小时,6小时,12小时,1天,7天,1个月，3个月，6个月，12个月.其中2000,6000,12000,为特殊权限需要联系客服开通
     * @param string $list json数组转化后的字符串 nid为节点ID从【获取可购买节点或获取服务器节点】获得，number为当前节点购买的数量,不可为0 [{"nid":625,"number":1}]
     * @param int $pid 	项目id,从【获取游戏项目】获得
     * @param int $isrand 1为自定义用户 默认为3，为1时【自定义代理用户名】不可为空
     * @param string $p_user 自定义代理用户名
     * @param string $p_pass 自定义代理密码
     * @param int $port 需要使用自定义的端口号，不自定义为0即可 
     * @param int $ipsegment IP段过滤，1：A段不重复,2：B段不重复，3：C段不重复，4：A,B段不重复，5：A,B,C段不重复
     * @param string $filter_sids 过滤服务器IP,值需要和【获取可购买/调换的节点】一致，下单时返回的sid值，多个用英文逗号分隔。可不传此值
     */
    public function specialOfferPlaceorder($time, $list, $pid, $isrand = 3, $p_user = '', $p_pass = '', $port = 0, $ipsegment = 0, $filter_sids = '')
    {
        $params = [
            'token' => $this->config ['token'],
            'time' => $time,
            'list' => $list,
            'pid' => $pid,
            'isrand' => $isrand,
            'p_user' => $p_user,
            'p_pass' => $p_pass,
            'port' => $port,
            'ipsegment' => $ipsegment,
            'filter_sids' => $filter_sids
        ];
        
        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/specialOfferPlaceorder', $params);
    }

    /**
     * 获取可购买/调换的节点(特价版)
     * @param string $pid 游戏项目ID，通过【获取游戏项目】接口获取到的ID，如果下面的ids数据不为空。要保证项目唯一
     * @param string $page 当前页数
     * @param string $limit 每次获取数据量，为0则page参数无效，直接返回全部
     * @param string $area_id 省份ID，通过【获取省份】接口获取到的ID，传0则返回全部
     * @param string $ipsegment IP段过滤，1：A段不重复,2：B段不重复，3：C段不重复，4：A,B段不重复，5：A,B,C段不重复，默认为0
     * @param string $filter_sids 过滤服务器IP，下单时返回的sid值，【下单购买】或【代理调换】要传送一样的值否则过滤失效，多个用英文逗号分隔。可不传此值
     * @param string $ids 需要调换的proxyid值多个用英文逗号分隔。调换时用到【预过滤可能存在的值】，根据【代理调换】isrand 为1或4时需要重新拉取
     * @param string $isrand 跟随【下单购买】或【代理调换】的【isrand】值同步，值变动时需要使用此接口重新拉取
     * @param string $user 调换/下单时用到【预过滤可能存在的值】，当isrand= 1时，【代理调换】【info[p_user]】的值或者【下单购买】【p_user】的值同步变动时需要使用此接口重新拉取
     */
    public function getSpecialOfferNodedata($pid, $page = 1, $limit = 1000, $area_id = 0, $ipsegment = 0, $filter_sids = '', $ids = '', $user = '')
    {
        $params = [
            'token' => $this->config ['token'],
            'pid' => $pid,
            'page' => $page,
            'limit' => $limit,
            'area_id' => $area_id,
            'ipsegment' => $ipsegment,
            'filter_sids' => $filter_sids,
            'ids' => $ids,
            'user' => $user
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getSpecialOfferNodedata', $params);
    }

    /**
     * 代理续费
     * @param int $time 只能是1,3,6,12。分别代表1个月，3个月，6个月，12个月.
     * @param string $ids 数组转json字符串,其中的数字为下单购买返回的子订单id【proxyid】
     */
    public function specialOfferRenew($time, $ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'time' => $time,
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url']. 'index/specialOfferRenew', $params);
    }

    /**
     * 代理调换（同步）返回速度稍慢，并发会阻塞(特价版)
     * 此接口调换速度较慢，不允许并发。并发会被阻塞。超时请设置无限大，如果并发太大可能会超时
     * @param array $ids 切记，切记，不可多个项目同时调换，数组转json字符串,其中的数字为下单购买返回的子订单id【proxyid】
     * @param array $node [{"nid":559,"number":1}]数组转json字符串 nid为节点ID从【获取可购买节点或获取服务器节点或下单购买返回的nid】获得，number为当前节点调换的数量,不可为0，同一个nid值 ,number请叠加
     * @param string $isrand 默认3用户名密码设置方法,4为原有用户名，3是先随机在顺序，1是自定义
     * @param string $info[p_user] 自定义用户名，如果用户名不填写默认为3先随机在顺序，实际合并在一起就是 info = {"p_user":"用户名","p_pass":"密码"} 字符串
     * @param string $info[p_pass] 自定义密码，如果密码不填写密码且存在自定义用户名那么默认密码 = 用户名 ，实际合并在一起就是 info = {"p_user":"用户名","p_pass":"密码"} 字符串
     * @param string $filter_sids 过滤服务器IP,值需要和【获取可购买/调换的节点】一致，下单时返回的sid值，多个用英文逗号分隔。可不传此值
     */
    public function specialOfferExchangeSync($ids, $node, $isrand, $info, $filter_sids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids,
            'node' => $node,
            'info' => $info,
            'filter_sids' => $filter_sids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/specialOfferExchangeSync', $params);
    }

    /******************************************************************
     *                          安卓项目                               *
     ******************************************************************/
    /**
     * 获取安卓项目(可以缓存本地)
     */
    public function androidGetProject()
    {
        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/getProject', ['token' => $this->config ['token']]);
    }

    /**
     * 创建一个安卓用户（此用户无法登录官网，只适用安卓登录）
     * @param string $username 安卓用户账户名
     * @param string $password 安卓用户密码
     * @param string $mobile 用户手机号
     */
    public function androidCreateUser($username, $password, $mobile)
    {
        $params = [
            'token' => $this->config ['token'],
            'username' => $username,
            'password' => $password,
            'mobile' => $mobile
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/createUser', $params);
    }

    /**
     * 安卓购买
     * @param int $user_id 【创建成功后】的用户UID,后面新开安卓功能会用到
     * @param int $number 购买数量
     * @param int $pid 项目ID
     * @param int $time 购买时间单位（月），支持大于1的正整数，默认为1
     * @param string $note 用户备注
     */
    public function androidBuy($user_id, $number, $pid, $time, $note)
    {
        $params = [
            'token' => $this->config ['token'],
            'user_id' => $user_id,
            'number' => $number,
            'pid' => $pid,
            'time' => $time,
            'note' => $note
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/buy', $params);
    }

    /**
     * 修改已购安卓备注
     * @param string $note 用户备注
     * @param int $android_id 购买返回的android_id
     * @param int $user_id 【创建成功后】的用户UID,后面新开安卓功能会用到
     */
    public function androidEditNote($note, $android_id, $user_id)
    {
        
        $params = [
            'token' => $this->config ['token'],
            'note' => $note,
            'android_id' => $android_id,
            'user_id' => $user_id,
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/editNote', $params);
    }

    /**
     * 修改已购安卓备注
     * @param int $pid 项目ID
     * @param string $android_ids 购买后返回的android_id [219] 
     * @param int $user_id 对应用户ID
     */
    public function androidEditProject($pid, $android_ids, $user_id)
    {
        $params = [
            'token' => $this->config ['token'],
            'pid' => $pid,
            'android_ids' => $android_ids,
            'user_id' => $user_id,
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/editProject', $params);
    }

    /**
     * 安卓续费
     * @param array $android_ids 购买后返回的android_id [219] 
     * @param int $user_id 对应用户ID
     * @param int $time 购买时间单位（月），支持大于1的正整数，默认为1
     */
    public function androidRenew($android_ids, $user_id, $time)
    {
        $params = [
            'token' => $this->config ['token'],
            'android_ids' => $android_ids,
            'user_id' => $user_id,
            'time' => $time
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/renew', $params);
    }

    /**
     * 退订数据初始化
     * @param int $user_id 对应用户ID
     * @param array $android_ids 购买后返回的android_id [219]
     */
    public function androidInitUnsubscribe($user_id, $android_ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'user_id' => $user_id,
            'android_ids' => $android_ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/initUnsubscribe', $params);
    }

    /**
     * 退订新开（使用这个请先使用退订初始化）
     * @param int $user_id 对应用户ID
     * @param string $android_ids 购买后返回的android_id [219]
     */
    public function androidUnSubscribe($user_id, $android_ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'user_id' => $user_id,
            'android_ids' => $android_ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/unsubscribe', $params);
    }

    /**
     * 修改已创建用户密码
     * @param int $user_id 对应用户ID
     * @param string $password 安卓用户密码
     */
    public function androidEditUserPass($user_id, $password)
    {
        $params = [
            'token' => $this->config ['token'],
            'user_id' => $user_id,
            'password' => $password
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/editUserPass', $params);
    }

    /**
     * 删除接口(此接口只做删除用,不退积分.需要退积分的请使用退订接口)
     * @param int $user_id 对应用户ID
     * @param string $android_ids 购买后返回的android_id [219]
     */
    public function androidDel($user_id, $android_ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'user_id' => $user_id,
            'android_ids' => $android_ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'android/del', $params);
    }

    /******************************************************************
     *                          家庭住宅                               *
     ******************************************************************/
    /**
     * 修改代理密码【住宅通用】
     * @param string $pass 密码
     * @param string $ids 数组转json字符串，也就是开通时的proxyid
     */
    public function editPass($pass, $ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'pass' => $pass,
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/editpass', $params);
    }

    /******************************************************************
     *                          住宅(J节点)                            *
     ******************************************************************/
    /**
     * 获取共享动态节点数据【新开】
     * @param int $pid 项目ID
     */
    public function getDwellingShareNode($pid)
    {
        $params = [
            'token' => $this->config ['token'],
            'pid' => $pid
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getDwellingShareNode', $params);
    }

    /**
     * 获取定制动态节点数据
     */
    public function getDwellingCustomNode()
    {
        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getDwellingShareNode', ['token' => $this->config ['token']]);
    }

    /**
     * 共享住宅下单
     * @param int $pid 项目ID
     * @param int $time 支持100,700,1-12正整数，100为一天，700为一周，1-12代表一至十二个月，测试（如果有）2000为 2小时，6000为6小时，12000为12小时
     * @param string $node 数组转json字符串，areaid 对应 【获取共享动态节点数据】的 id ，cityid 是对应省份childer里的id（bigint）。isp只支持 1,2,3,。其中1是电信,2是移动，3是联通，number为开通数量[{"areaid":100,"cityid":"110100000000","isp":3,"number":2}]
     */
    public function sharePlaceorder($pid, $time, $node)
    {
        $params = [
            'token' => $this->config ['token'],
            'pid' => $pid,
            'time' => $time,
            'node' => $node
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/sharePlaceorder', $params);
    }

    /**
     * 定制住宅下单
     * @param int $pid 项目ID
     * @param int $time 支持100,700,1-12正整数，100为一天，700为一周，1-12代表一至十二个月，测试（如果有）2000为 2小时，6000为6小时，12000为12小时
     * @param string $node 数组转json字符串，areaid 对应 【获取共享动态节点数据】的 id ，cityid 是对应省份childer里的id（bigint）。isp只支持 1,2,3,。其中1是电信,2是移动，3是联通，number为开通数量[{"areaid":100,"cityid":"110100000000","isp":3,"number":2}]
     */
    public function customPlaceorder($pid, $time, $node)
    {
        $params = [
            'token' => $this->config ['token'],
            'pid' => $pid,
            'time' => $time,
            'node' => $node
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/customPlaceorder', $params);
    }

    /**
     * 共享节点续费
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     * @param int $time 支持1-12正整数，1代表一个月以此类推
     */
    public function shareRenew($ids, $time)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids,
            'time' => $time,
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/shareRenew', $params);
    }
    
    /**
     * 定制节点续费
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     * @param int $time 支持1-12正整数，1代表一个月以此类推
     */
    public function customRenew($ids, $time)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids,
            'time' => $time,
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/customRenew', $params);
    }

    /**
     * 获取共享可调换节点数量【调换】
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     */
    public function getShareExchangeNode($ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getShareExchangeNode', $params);
    }

    /**
     * 共享调换
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     * @param string $area [{"areaid":110,"cityid":110100000000,"isp":1,"number":1}] 数组转json字符串， areaid 对应 【获取定制动态节点数据】的 id ，cityid 是对应省份childer里的id（bigint）。isp只支持 1,3,。其中1是电信，3是联通，number为当前地区选择的数量，会按照数组顺序数量调换
     */
    public function shareExchange($ids, $area)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids,
            'area' => $area
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/shareExchange', $params);
    }

    /**
     * 定制调换
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     * @param string $area [{"areaid":110,"cityid":110100000000,"isp":1,"number":1}] 数组转json字符串， areaid 对应 【获取定制动态节点数据】的 id ，cityid 是对应省份childer里的id（bigint）。isp只支持 1,3,。其中1是电信，3是联通，number为当前地区选择的数量，会按照数组顺序数量调换
     */
    public function customExchange($ids, $area)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids,
            'area' => $area
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/customExchange', $params);
    }

    /**
     * 退订数据初始化
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     */
    public function shareInitUnsubscribe($ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/shareInitUnsubscribe', $params);
    }

    /**
     * 退订新开（使用这个请先使用退订初始化）
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     */
    public function shareUnsubscribe($ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/shareUnsubscribe', $params);
    }

    /******************************************************************
     *                          住宅(N节点)                            *
     ******************************************************************/
    /**
     * 获取共享动态节点数据【新开】
     * @param int $pid 项目ID
     */
    public function getDwellingShareNodeB($pid)
    {
        $params = [
            'token' => $this->config ['token'],
            'pid' => $pid
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getDwellingShareNodeB', $params);
    }

    /**
     * 共享住宅下单
     * @param int $pid 项目ID
     * @param int $time 支持100,700,1-12正整数，100为一天，700为一周，1-12代表一至十二个月，测试（如果有）2000为 2小时，6000为6小时，12000为12小时
     * @param string $node [{"areaid":110,"cityid":110100000000,"isp":1,"number":1}] 数组转json字符串，areaid 对应 【获取共享动态节点数据】的 id ，cityid 是对应省份childer里的id（bigint）。isp只支持 1,2,3,。其中1是电信,2是移动，3是联通，number为开通数量[{"areaid":100,"cityid":"110100000000","isp":3,"number":2}]
     
     */
    public function sharePlaceorderB($pid, $time, $node)
    {
        $params = [
            'token' => $this->config ['token'],
            'pid' => $pid,
            'time' => $time,
            'node' => $node
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/sharePlaceorderB', $params);
    }
    
    /**
     * 共享节点续费
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     * @param int $time 支持1-12正整数，1代表一个月以此类推
     */
    public function shareRenewB($ids, $time)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids,
            'time' => $time,
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/shareRenewB', $params);
    }

    /**
     * 获取共享可调换节点数量【调换】
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     */
    public function getShareExchangeNodeB($ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/getShareExchangeNodeB', $params);
    }

    /**
     * 共享调换
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     * @param string $area [{"areaid":110,"cityid":110100000000,"isp":1,"number":1}] 数组转json字符串， areaid 对应 【获取定制动态节点数据】的 id ，cityid 是对应省份childer里的id（bigint）。isp只支持 1,3,。其中1是电信，3是联通，number为当前地区选择的数量，会按照数组顺序数量调换
     */
    public function shareExchangeB($ids, $area)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids,
            'area' => $area
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/shareExchangeB', $params);
    }

    /**
     * 退订数据初始化
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     */
    public function shareInitUnsubscribeB($ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/shareInitUnsubscribeB', $params);
    }

    /**
     * 退订新开（使用这个请先使用退订初始化）
     * @param int $ids 数组转json字符串，也就是开通时的proxyid
     */
    public function shareUnsubscribeB($ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/shareUnsubscribeB', $params);
    }

    /******************************************************************
     *                          pptp/l2tp                             *
     ******************************************************************/
    /**
     * 获取可购买/调换的节点
     * @param int $type 0为按省份拉取,1按城市拉取,不传此值默认以省份拉取
     * @param string $pid 游戏项目ID，通过【获取游戏项目】接口获取到的ID，如果下面的ids数据不为空。要保证项目唯一
     * @param string $filter_sids 过滤服务器IP，下单时返回的sid值，【下单购买】或【代理调换】要传送一样的值否则过滤失效，多个用英文逗号分隔。可不传此值
     * @param string $ids 需要调换的proxyid值多个用英文逗号分隔。调换时用到【预过滤可能存在的值】
     * @param int $ipsegment IP段过滤，1：A,B段不重复，2：A,B,C段不重复.默认不过滤
     */
    public function vpnGetNodeData($type, $pid, $filter_sids = '', $ids = '', $ipsegment = 0)
    {
        $params = [
            'token' => $this->config ['token'],
            'type' => $type,
            'filter_sids' => $filter_sids,
            'ids' => $ids,
            'ipsegment' => $ipsegment
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/getNodeData', $params);
    }

    /**
     * 调换
     * 此接口调换速度较慢，不允许并发。并发会被阻塞。超时请设置无限大，如果并发太大可能会超时
     * @param int $type 0为按省份拉取,1按城市拉取,不传此值默认以省份拉取
     * @param int $time 只能是2000,6000,12000,100,700,1,3,6,12。分别代表2小时,6小时,12小时,1天,7天,1个月，3个月，6个月，12个月.其中2000,6000,12000,为特殊权限需要联系客服开通
     * @param string $list [{"id":"340200000000","number":1}]json数组转化后的字符串 , id值为对应【获取可购买/调换的节点】拉取的对象id值
     * @param string $pid 项目id,从【获取游戏项目】获得
     * @param int $ipsegment IP段过滤，1：A,B段不重复，2：A,B,C段不重复.默认不过滤
     * @param string $filter_sids 过滤服务器IP，下单时返回的sid值，【下单购买】或【代理调换】要传送一样的值否则过滤失效，多个用英文逗号分隔。可不传此
     */
    public function vpnPlaceorder($type, $time, $list, $pid, $ipsegment = 0, $filter_sids = '')
    {
        $params = [
            'token' => $this->config ['token'],
            'type' => $type,
            'time' => $time,
            'list' => $list,
            'pid' => $pid,
            'ipsegment' => $ipsegment,
            'filter_sids' => $filter_sids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/placeorder', $params);
    }

    /**
     * 下单购买
     * @param int $type 0为按省份拉取,1按城市拉取,不传此值默认以省份拉取
     * @param string $ids [7,8] 切记，切记，不可多个项目同时调换，数组转json字符串,其中的数字为下单购买返回的子订单id【proxyid】
     * @param string $node [{"id":340200000000,"number":1},{"id":620100000000,"number":1}] json数组转化后的字符串 , id值为对应【获取可购买/调换的节点】拉取的对象id值
     * @param string $filter_sids 过滤服务器IP，下单时返回的sid值，【下单购买】或【代理调换】要传送一样的值否则过滤失效，多个用英文逗号分隔。可不传此
     * @param int $ipsegment IP段过滤，1：A,B段不重复，2：A,B,C段不重复.默认不过滤
     */
    public function vpnExchange($type, $time, $list, $pid, $ipsegment = 0, $filter_sids = '')
    {
        $params = [
            'token' => $this->config ['token'],
            'type' => $type,
            'time' => $time,
            'list' => $list,
            'pid' => $pid,
            'ipsegment' => $ipsegment,
            'filter_sids' => $filter_sids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/exchange', $params);
    }

    /**
     * 续费
     * @param int $time 只能是100,700,1,3,6,12。分别代表1天,7天,1个月，3个月，6个月，12个月.1天和7天必须有权限才可以，其它默认有权限
     * @param string $ids [7,8] 切记，切记，不可多个项目同时调换，数组转json字符串,其中的数字为下单购买返回的子订单id【proxyid】
     */
    public function vpnRenew($time, $ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'time' => $time,
            'ids' => $ids,
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/renew', $params);
    }

    /**
     * 代理用户密码修改
     * @param string $ids [7,8] 切记，切记，不可多个项目同时调换，数组转json字符串,其中的数字为下单购买返回的子订单id【proxyid】
     * @param string $pass 需要修改的新密码
     */
    public function vpnEditpass($time, $pass)
    {
        $params = [
            'token' => $this->config ['token'],
            'time' => $time,
            'pass' => $pass,
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/editpass', $params);
    }

    /**
     * 退订数据初始化
     * @param string $ids [7,8] int类型，就是开通时的ID值
     */
    public function vpnInitUnsubscribe($ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/nitUnsubscribe', $params);
    }

    /**
     * 退订新开（使用这个请先使用退订初始化）
     * @param string $ids [7,8] 初始化锁定的数组，不能加不能减，否则无法退订
     */
    public function vpnUnsubscribe($ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/unsubscribe', $params);
    }

    /**
     * 解除锁定/给予锁定
     * @param string $ids [7,8] 初始化锁定的数组，不能加不能减，否则无法退订
     * @param int $islock 0或不填写则解锁,1则进行锁定
     */
    public function vpnLockAction($ids, $islock)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids,
            'islock' => $islock
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/lockAction', $params);
    }

    /**
     * 获取vpn最新详情
     * @param string $ids [7,8] 新开时的proxyid,数组转json字符串，如[1,2,3,4,5]。最大可以获取1000条数据，大于1000条自动丢弃
     */
    public function vpnGetVpnDetails($ids, $islock)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/getVpnDetails', $params);
    }
    
    /**
     * 删除接口(此接口只做删除用,不退积分.需要退积分的请使用退订接口)
     * @param string $ids [7,8] 新开时的proxyid,数组转json字符串，如[1,2,3,4,5]。最大可以获取1000条数据，大于1000条自动丢弃
     */
    public function vpnDel($ids)
    {
        $params = [
            'token' => $this->config ['token'],
            'ids' => $ids
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'vpn/del', $params);
    }
    
    /**
     * 代理用户修改密码【高级】
     * @param string $data [{ "proxyid": 1, "pass": "pass" }, { "proxyid": 2, "pass": "pass" } ] 数组转JSON字符串
     */
    public function editPassAdvanced($data)
    {
        $params = [
            'token' => $this->config ['token'],
            'data' => $data
        ];

        return $this->client->formRequest('post', $this->config ['server_url'] . 'index/deditPassAdvancedel', $params);
    }
}